Reactã«ã¹ã¿ã ããã¯ã广çã«åæããè€éãªããžãã¯ãæœè±¡åããŠã³ãŒãã®åå©çšæ§ãšä¿å®æ§ãåäžãããæ¹æ³ãåŠã³ãŸããå®è·µçãªäŸãšãã¹ããã©ã¯ãã£ã¹ã玹ä»ã
Reactã«ã¹ã¿ã ããã¯ã®ã³ã³ããžã·ã§ã³ïŒè€éãªããžãã¯ã®æœè±¡åããã¹ã¿ãŒãã
Reactã®ã«ã¹ã¿ã ããã¯ã¯ãReactã¢ããªã±ãŒã·ã§ã³å ã§ã¹ããŒããã«ãªããžãã¯ãã«ãã»ã«åããåå©çšããããã®åŒ·åãªããŒã«ã§ããããããã¢ããªã±ãŒã·ã§ã³ãè€éã«ãªãã«ã€ããŠãã«ã¹ã¿ã ããã¯å ã®ããžãã¯ãè€éã«ãªããŸããããã¯ãçè§£ããã¹ããä¿å®ãå°é£ãªã¢ããªã·ãã¯ãªããã¯ã«ã€ãªããå¯èœæ§ããããŸããã«ã¹ã¿ã ããã¯ã®ã³ã³ããžã·ã§ã³ã¯ãè€éãªããžãã¯ãããå°ããã管çãããããåå©çšå¯èœãªããã¯ã«åå²ããããšã§ããã®åé¡ã®è§£æ±ºçãæäŸããŸãã
ã«ã¹ã¿ã ããã¯ã®ã³ã³ããžã·ã§ã³ãšã¯ïŒ
ã«ã¹ã¿ã ããã¯ã®ã³ã³ããžã·ã§ã³ãšã¯ãè€æ°ã®å°ããªã«ã¹ã¿ã ããã¯ãçµã¿åãããŠãããè€éãªæ©èœãäœæããå®è·µæ¹æ³ã§ãããã¹ãŠãåŠçããåäžã®å€§ããªããã¯ãäœæãã代ããã«ããããããããžãã¯ã®ç¹å®ã®åŽé¢ãæ åœããããã€ãã®å°ããªããã¯ãäœæããŸãããããã®å°ããªããã¯ãçµã¿åãããŠãç®çã®æ©èœãå®çŸã§ããŸãã
LEGOãããã¯ã§çµã¿ç«ãŠããããªãã®ã ãšèããŠãã ãããåãããã¯ïŒå°ããªããã¯ïŒã¯ç¹å®ã®æ©èœãæã¡ãããããããŸããŸãªæ¹æ³ã§çµã¿åãããŠè€éãªæ§é ç©ïŒãã倧ããªæ©èœïŒãæ§ç¯ããŸãã
ã«ã¹ã¿ã ããã¯ã³ã³ããžã·ã§ã³ã®ã¡ãªãã
- ã³ãŒãã®åå©çšæ§ã®åäžïŒ ããå°ãããçŠç¹ã®çµãããããã¯ã¯ãæ¬è³ªçã«ç°ãªãã³ã³ããŒãã³ãããããã«ã¯ç°ãªããããžã§ã¯ãéã§ãåå©çšãããããªããŸãã
- ä¿å®æ§ã®åäžïŒ è€éãªããžãã¯ãèªå·±å®çµããå°ããªåäœã«åå²ããããšã§ãã³ãŒãã®çè§£ããããã°ã倿Žã容æã«ãªããŸãã1ã€ã®ããã¯ãžã®å€æŽãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã«åœ±é¿ãäžããå¯èœæ§ãäœããªããŸãã
- ãã¹ãå®¹ææ§ã®åäžïŒ å°ããªããã¯ã¯åå¥ã«ãã¹ããããããããããå ç¢ã§ä¿¡é Œæ§ã®é«ãã³ãŒãã«ã€ãªãããŸãã
- ã³ãŒãæ§æã®æ¹åïŒ ã³ã³ããžã·ã§ã³ã¯ãããã¢ãžã¥ãŒã«åããæŽçãããã³ãŒãããŒã¹ãä¿é²ããã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãéšåéã®é¢ä¿ãããã²ãŒãããçè§£ããããããŸãã
- ã³ãŒãéè€ã®åæžïŒ å ±éã®ããžãã¯ãåå©çšå¯èœãªããã¯ã«æœåºããããšã§ãã³ãŒãã®éè€ãæå°éã«æããããç°¡æœã§ä¿å®ããããã³ãŒãããŒã¹ã«ã€ãªãããŸãã
ã«ã¹ã¿ã ããã¯ã³ã³ããžã·ã§ã³ã䜿çšãã¹ãæ
以äžã®ãããªå Žåã«ã«ã¹ã¿ã ããã¯ã®ã³ã³ããžã·ã§ã³ã®äœ¿çšãæ€èšãã¹ãã§ãïŒ
- åäžã®ã«ã¹ã¿ã ããã¯ã倧ãããªããããè€éã«ãªã£ãŠããå Žåã
- è€æ°ã®ã«ã¹ã¿ã ããã¯ãã³ã³ããŒãã³ãã§é¡äŒŒã®ããžãã¯ãéè€ããŠèšè¿°ããŠããããšã«æ°ã¥ããå Žåã
- ã«ã¹ã¿ã ããã¯ã®ãã¹ãå®¹ææ§ãåäžããããå Žåã
- ããã¢ãžã¥ãŒã«åãããåå©çšå¯èœãªã³ãŒãããŒã¹ãäœæãããå Žåã
ã«ã¹ã¿ã ããã¯ã³ã³ããžã·ã§ã³ã®åºæ¬åå
ã«ã¹ã¿ã ããã¯ã®ã³ã³ããžã·ã§ã³ãžã®ã¢ãããŒããå°ãããã®ãããã€ãã®éèŠãªååã以äžã«ç€ºããŸãïŒ
- åäžè²¬ä»»ã®ååïŒ åã«ã¹ã¿ã ããã¯ã¯ãåäžã®æç¢ºã«å®çŸ©ããã責任ãæã€ã¹ãã§ããããã«ãããããã¯ã®çè§£ããã¹ããåå©çšã容æã«ãªããŸãã
- é¢å¿ã®åé¢ïŒ ããžãã¯ã®ç°ãªãåŽé¢ãç°ãªãããã¯ã«åé¢ããŸããäŸãã°ãããŒã¿ãååŸããããã®ããã¯ãç¶æ ã管çããããã®ããã¯ãå¯äœçšãåŠçããããã®ããã¯ãªã©ãæã€ããšãã§ããŸãã
- åæå¯èœæ§ïŒ ä»ã®ããã¯ãšç°¡åã«åæã§ããããã«ããã¯ãèšèšããŸããããã¯å€ãã®å Žåãä»ã®ããã¯ã䜿çšã§ããããŒã¿ã颿°ãè¿ãããšãå«ã¿ãŸãã
- åœåèŠåïŒ ããã¯ã®ç®çãšæ©èœã瀺ãããã«ãæç¢ºã§èª¬æçãªååã䜿çšããŸããäžè¬çãªæ £ç¿ã¯ãããã¯åã®åã«`use`ãä»ããããšã§ãã
äžè¬çãªã³ã³ããžã·ã§ã³ãã¿ãŒã³
ã«ã¹ã¿ã ããã¯ãåæããããã«äœ¿çšã§ãããã¿ãŒã³ã¯ããã€ããããŸãã以äžã«æãäžè¬çãªãã®ãããã€ã玹ä»ããŸãïŒ
1. ã·ã³ãã«ãªããã¯ã³ã³ããžã·ã§ã³
ããã¯æãåºæ¬çãªã³ã³ããžã·ã§ã³ã®åœ¢åŒã§ãããããã¯ãå¥ã®ããã¯ãåŒã³åºãããã®æ»ãå€ã䜿çšãããã®ã§ãã
äŸïŒ ãŠãŒã¶ãŒããŒã¿ãååŸããããã¯ãšãæ¥ä»ããã©ãŒãããããããã¯ããããšããŸãããããã®ããã¯ãåæããŠããŠãŒã¶ãŒããŒã¿ãååŸãããŠãŒã¶ãŒã®ç»é²æ¥ããã©ãŒãããããæ°ããããã¯ãäœæã§ããŸãã
import { useState, useEffect } from 'react';
function useUserData(userId) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchData() {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const jsonData = await response.json();
setData(jsonData);
} catch (e) {
setError(e);
} finally {
setLoading(false);
}
}
fetchData();
}, [userId]);
return { data, loading, error };
}
function useFormattedDate(dateString) {
try {
const date = new Date(dateString);
const formattedDate = date.toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' });
return formattedDate;
} catch (error) {
console.error("Error formatting date:", error);
return "Invalid Date";
}
}
function useUserWithFormattedDate(userId) {
const { data, loading, error } = useUserData(userId);
const formattedRegistrationDate = data ? useFormattedDate(data.registrationDate) : null;
return { ...data, formattedRegistrationDate, loading, error };
}
export default useUserWithFormattedDate;
解説ïŒ
useUserDataã¯APIãããŠãŒã¶ãŒããŒã¿ãååŸããŸããuseFormattedDateã¯æ¥ä»æååããŠãŒã¶ãŒãã¬ã³ããªãŒãªåœ¢åŒã«ãã©ãŒãããããŸããæ¥ä»ã®è§£æãšã©ãŒãé©åã«åŠçããŸããtoLocaleDateStringãžã®undefinedåŒæ°ã¯ããã©ãŒãããã«ãŠãŒã¶ãŒã®ãã±ãŒã«ã䜿çšããŸããuseUserWithFormattedDateã¯äž¡æ¹ã®ããã¯ãåæããŸããæåã«useUserDataã䜿çšããŠãŠãŒã¶ãŒããŒã¿ãååŸããŸããæ¬¡ã«ãããŒã¿ãå©çšå¯èœãªå ŽåãuseFormattedDateã䜿çšããŠregistrationDateããã©ãŒãããããŸããæåŸã«ãå ã®ãŠãŒã¶ãŒããŒã¿ãšãã©ãŒããããããæ¥ä»ãããŒãã£ã³ã°ç¶æ ãããã³æœåšçãªãšã©ãŒãè¿ããŸãã
2. ç¶æ ãå ±æããããã¯ã³ã³ããžã·ã§ã³
ãã®ãã¿ãŒã³ã§ã¯ãè€æ°ã®ããã¯ãåãç¶æ
ãå
±æãã倿ŽããŸããããã¯ãuseContextã䜿çšããããããã¯éã§ç¶æ
ãšã»ãã¿ãŒé¢æ°ãæž¡ãããšã«ãã£ãŠå®çŸã§ããŸãã
äŸïŒ è€æ°ã¹ãããã®ãã©ãŒã ãæ§ç¯ãããšããŸããåã¹ãããã«ã¯ããã®ã¹ãããåºæã®å
¥åãã£ãŒã«ããšæ€èšŒããžãã¯ã管çããããã®ç¬èªã®ããã¯ãæãããããšãã§ããŸããããããã¯ãã¹ãŠãuseReducerãšuseContextã䜿çšããŠèŠªããã¯ã«ãã£ãŠç®¡çãããå
±éã®ãã©ãŒã ç¶æ
ãå
±æããŸãã
import React, { createContext, useContext, useReducer } from 'react';
// Define the initial state
const initialState = {
step: 1,
name: '',
email: '',
address: ''
};
// Define the actions
const ACTIONS = {
NEXT_STEP: 'NEXT_STEP',
PREVIOUS_STEP: 'PREVIOUS_STEP',
UPDATE_FIELD: 'UPDATE_FIELD'
};
// Create the reducer
function formReducer(state, action) {
switch (action.type) {
case ACTIONS.NEXT_STEP:
return { ...state, step: state.step + 1 };
case ACTIONS.PREVIOUS_STEP:
return { ...state, step: state.step - 1 };
case ACTIONS.UPDATE_FIELD:
return { ...state, [action.payload.field]: action.payload.value };
default:
return state;
}
}
// Create the context
const FormContext = createContext();
// Create a provider component
function FormProvider({ children }) {
const [state, dispatch] = useReducer(formReducer, initialState);
const value = {
state,
dispatch,
nextStep: () => dispatch({ type: ACTIONS.NEXT_STEP }),
previousStep: () => dispatch({ type: ACTIONS.PREVIOUS_STEP }),
updateField: (field, value) => dispatch({ type: ACTIONS.UPDATE_FIELD, payload: { field, value } })
};
return (
{children}
);
}
// Custom hook for accessing the form context
function useFormContext() {
const context = useContext(FormContext);
if (!context) {
throw new Error('useFormContext must be used within a FormProvider');
}
return context;
}
// Custom hook for Step 1
function useStep1() {
const { state, updateField } = useFormContext();
const updateName = (value) => updateField('name', value);
return {
name: state.name,
updateName
};
}
// Custom hook for Step 2
function useStep2() {
const { state, updateField } = useFormContext();
const updateEmail = (value) => updateField('email', value);
return {
email: state.email,
updateEmail
};
}
// Custom hook for Step 3
function useStep3() {
const { state, updateField } = useFormContext();
const updateAddress = (value) => updateField('address', value);
return {
address: state.address,
updateAddress
};
}
export { FormProvider, useFormContext, useStep1, useStep2, useStep3 };
解説ïŒ
createContextã䜿çšããŠFormContextãäœæããããã©ãŒã ã®ç¶æ ãšdispatch颿°ãä¿æããŸããformReducerã¯useReducerã䜿çšããŠãã©ãŒã ã®ç¶æ æŽæ°ã管çããŸããNEXT_STEPãPREVIOUS_STEPãUPDATE_FIELDã®ãããªã¢ã¯ã·ã§ã³ãç¶æ ã倿Žããããã«å®çŸ©ãããŠããŸããFormProviderã³ã³ããŒãã³ãã¯ããã®åã«ãã©ãŒã ã³ã³ããã¹ããæäŸãããã©ãŒã ã®ãã¹ãŠã®ã¹ãããã§ç¶æ ãšdispatchãå©çšã§ããããã«ããŸãããŸããã¢ã¯ã·ã§ã³ã®ãã£ã¹ããããç°¡çŽ åããããã«`nextStep`ã`previousStep`ã`updateField`ã®ãã«ããŒé¢æ°ãå ¬éããŸããuseFormContextããã¯ã¯ãã³ã³ããŒãã³ãããã©ãŒã ã³ã³ããã¹ãã®å€ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã- åã¹ãããïŒ
useStep1ãuseStep2ãuseStep3ïŒã¯ããã®ã¹ãããã«é¢é£ããå ¥åã管çããããã«ç¬èªã®ããã¯ãäœæããuseFormContextã䜿çšããŠç¶æ ãååŸãããããæŽæ°ããããã®dispatch颿°ãååŸããŸããåã¹ãããã¯ããã®ã¹ãããã«é¢é£ããããŒã¿ãšé¢æ°ã®ã¿ãå ¬éããåäžè²¬ä»»ã®ååã«åŸããŸãã
3. ã©ã€ããµã€ã¯ã«ç®¡çã䌎ãããã¯ã³ã³ããžã·ã§ã³
ãã®ãã¿ãŒã³ã«ã¯ãããŠã³ããæŽæ°ãã¢ã³ããŠã³ããªã©ãã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã®ããŸããŸãªãã§ãŒãºã管çããããã¯ãå«ãŸããŸããããã¯ãå€ãã®å Žåãåæãããããã¯å
ã§useEffectã䜿çšããããšã§å®çŸãããŸãã
äŸïŒ ãªã³ã©ã€ã³/ãªãã©ã€ã³ã®ç¶æ ã远跡ããå¿ èŠããããã¢ã³ããŠã³ãæã«ã¯ãªãŒã³ã¢ããåŠçãè¡ãå¿ èŠãããã³ã³ããŒãã³ããèããŠã¿ãŸãããããããã®åã¿ã¹ã¯ã«å¯ŸããŠå¥ã ã®ããã¯ãäœæããããããåæããããšãã§ããŸãã
import { useState, useEffect } from 'react';
function useOnlineStatus() {
const [isOnline, setIsOnline] = useState(navigator.onLine);
useEffect(() => {
function handleOnline() {
setIsOnline(true);
}
function handleOffline() {
setIsOnline(false);
}
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
return isOnline;
}
function useDocumentTitle(title) {
useEffect(() => {
document.title = title;
return () => {
document.title = 'Original Title'; // Revert to a default title on unmount
};
}, [title]);
}
function useAppLifecycle(title) {
const isOnline = useOnlineStatus();
useDocumentTitle(title);
return isOnline; // Return the online status
}
export { useAppLifecycle, useOnlineStatus, useDocumentTitle };
解説ïŒ
useOnlineStatusã¯ãonlineããã³offlineã€ãã³ãã䜿çšããŠãŠãŒã¶ãŒã®ãªã³ã©ã€ã³ç¶æ ã远跡ããŸããuseEffectããã¯ã¯ãã³ã³ããŒãã³ããããŠã³ãããããšãã«ã€ãã³ããªã¹ããŒãèšå®ããã¢ã³ããŠã³ãããããšãã«ããããã¯ãªãŒã³ã¢ããããŸããuseDocumentTitleã¯ããã¥ã¡ã³ãã®ã¿ã€ãã«ãæŽæ°ããŸãããŸããã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ã¿ã€ãã«ãããã©ã«ãå€ã«æ»ããã¿ã€ãã«ã®åé¡ãæ®ããªãããã«ããŸããuseAppLifecycleã¯äž¡æ¹ã®ããã¯ãåæããŸããuseOnlineStatusã䜿çšããŠãŠãŒã¶ãŒããªã³ã©ã€ã³ãã©ããã倿ããuseDocumentTitleã䜿çšããŠããã¥ã¡ã³ãã®ã¿ã€ãã«ãèšå®ããŸããçµåãããããã¯ã¯ãªã³ã©ã€ã³ç¶æ ãè¿ããŸãã
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
1. åœéå (i18n)
翻蚳ãšãã±ãŒã«ã®åãæ¿ãã®ç®¡çã¯è€éã«ãªãããšããããŸããããã¯ã³ã³ããžã·ã§ã³ã䜿çšããŠé¢å¿ãåé¢ããããšãã§ããŸãïŒ
useLocale(): çŸåšã®ãã±ãŒã«ã管çããŸããuseTranslations(): çŸåšã®ãã±ãŒã«ã®ç¿»èš³ãååŸããŠæäŸããŸããuseTranslate(key): 翻蚳ããŒãåãåãã翻蚳ãããæååãè¿ãããã¯ã§ãuseTranslationsããã¯ã䜿çšããŠç¿»èš³ã«ã¢ã¯ã»ã¹ããŸãã
ããã«ãããã¢ããªã±ãŒã·ã§ã³å
šäœã§ãã±ãŒã«ãç°¡åã«åãæ¿ãã翻蚳ã«ã¢ã¯ã»ã¹ã§ããŸãã翻蚳ããžãã¯ã管çããããã«ãã«ã¹ã¿ã ããã¯ãšå
±ã«i18nextã®ãããªã©ã€ãã©ãªã䜿çšããããšãæ€èšããŠãã ãããäŸãã°ãuseTranslationsã¯éžæããããã±ãŒã«ã«åºã¥ããŠãç°ãªãèšèªã®JSONãã¡ã€ã«ãã翻蚳ãèªã¿èŸŒãããšãã§ããŸãã
2. ãã©ãŒã ããªããŒã·ã§ã³
è€éãªãã©ãŒã ã¯ãåºç¯ãªããªããŒã·ã§ã³ãå¿ èŠãšããããšããããããŸããããã¯ã³ã³ããžã·ã§ã³ã䜿çšããŠãåå©çšå¯èœãªããªããŒã·ã§ã³ããžãã¯ãäœæã§ããŸãïŒ
useInput(initialValue): åäžã®å ¥åãã£ãŒã«ãã®ç¶æ ã管çããŸããuseValidator(value, rules): ã«ãŒã«ã»ããïŒäŸïŒrequired, email, minLengthïŒã«åºã¥ããŠåäžã®å ¥åãã£ãŒã«ããæ€èšŒããŸããuseForm(fields): ãã©ãŒã å šäœã®ç¶æ ãšããªããŒã·ã§ã³ã管çããåãã£ãŒã«ãã«å¯ŸããŠuseInputãšuseValidatorãåæããŸãã
ãã®ã¢ãããŒãã¯ã³ãŒãã®åå©çšæ§ãä¿é²ããããªããŒã·ã§ã³ã«ãŒã«ã®è¿œå ã倿Žã容æã«ããŸããFormikãReact Hook Formã®ãããªã©ã€ãã©ãªã¯ãäºåã«æ§ç¯ããããœãªã¥ãŒã·ã§ã³ãæäŸããŸãããç¹å®ã®ããªããŒã·ã§ã³ããŒãºã«åãããŠã«ã¹ã¿ã ããã¯ã§æ¡åŒµããããšãã§ããŸãã
3. ããŒã¿ãã§ãããšãã£ãã·ã³ã°
ããŒã¿ãã§ããããã£ãã·ã³ã°ããšã©ãŒãã³ããªã³ã°ã®ç®¡çã¯ãããã¯ã³ã³ããžã·ã§ã³ã§ç°¡çŽ åã§ããŸãïŒ
useFetch(url): æå®ãããURLããããŒã¿ããã§ããããŸããuseCache(key, fetchFunction): ããŒã䜿çšããŠãã§ãã颿°ã®çµæããã£ãã·ã¥ããŸããuseData(url, options):useFetchãšuseCacheãçµã¿åãããŠããŒã¿ããã§ããããçµæããã£ãã·ã¥ããŸãã
ããã«ãããé »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ãç°¡åã«ãã£ãã·ã¥ããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããSWR (Stale-While-Revalidate) ã React Query ã®ãããªã©ã€ãã©ãªã¯ãã«ã¹ã¿ã ããã¯ã§æ¡åŒµã§ãã匷åãªããŒã¿ãã§ãããšãã£ãã·ã³ã°ã®ãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã
4. èªèšŒ
èªèšŒããžãã¯ã®åŠçã¯ãç¹ã«ç°ãªãèªèšŒæ¹æ³ïŒäŸïŒJWTãOAuthïŒãæ±ãå Žåã«è€éã«ãªãããšããããŸããããã¯ã³ã³ããžã·ã§ã³ã¯ãèªèšŒããã»ã¹ã®ããŸããŸãªåŽé¢ãåé¢ããã®ã«åœ¹ç«ã¡ãŸãïŒ
useAuthToken(): èªèšŒããŒã¯ã³ã管çããŸãïŒäŸïŒããŒã«ã«ã¹ãã¬ãŒãžããã®ä¿åãšååŸïŒãuseUser(): èªèšŒããŒã¯ã³ã«åºã¥ããŠçŸåšã®ãŠãŒã¶ãŒã®æ å ±ãååŸããŠæäŸããŸããuseAuth(): ãã°ã€ã³ããã°ã¢ãŠãããµã€ã³ã¢ãããªã©ã®èªèšŒé¢é£ã®æ©èœãæäŸããä»ã®ããã¯ãåæããŸãã
ãã®ã¢ãããŒãã«ãããç°ãªãèªèšŒæ¹æ³ãç°¡åã«åãæ¿ããããèªèšŒããã»ã¹ã«æ°ããæ©èœã远å ãããããããšãã§ããŸããAuth0ãFirebase Authenticationã®ãããªã©ã€ãã©ãªããŠãŒã¶ãŒã¢ã«ãŠã³ããšèªèšŒã管çããããã®ããã¯ãšã³ããšããŠäœ¿çšãããããã®ãµãŒãã¹ãšå¯Ÿè©±ããããã®ã«ã¹ã¿ã ããã¯ãäœæã§ããŸãã
ã«ã¹ã¿ã ããã¯ã³ã³ããžã·ã§ã³ã®ãã¹ããã©ã¯ãã£ã¹
- ããã¯ã®çŠç¹ãçµãïŒ åããã¯ã¯æç¢ºã§ç¹å®ã®ç®çãæã€ã¹ãã§ãã
- æ·±ããã¹ããé¿ããïŒ ã³ãŒããçè§£ãã«ãããªãã®ãé¿ãããããã³ã³ããžã·ã§ã³ã®ã¬ãã«æ°ãå¶éããŸããããã¯ãè€éã«ãªããããå Žåã¯ãããã«åå²ããããšãæ€èšããŠãã ããã
- ããã¯ãææžåããïŒ åããã¯ã®ç®çãå ¥åãåºåã説æããæç¢ºã§ç°¡æœãªããã¥ã¡ã³ããæäŸããŸããããã¯ãä»ã®éçºè ã䜿çšããããã¯ã«ãšã£ãŠç¹ã«éèŠã§ãã
- ããã¯ããã¹ãããïŒ åããã¯ã®ãŠããããã¹ããäœæããæ£ããåäœããããšã確èªããŸããããã¯ãç¶æ ã管çãããå¯äœçšãå®è¡ãããããããã¯ã«ãšã£ãŠç¹ã«éèŠã§ãã
- ç¶æ 管çã©ã€ãã©ãªã®äœ¿çšãæ€èšããïŒ è€éãªç¶æ 管çã·ããªãªã§ã¯ãReduxãZustandãJotaiãªã©ã®ã©ã€ãã©ãªã®äœ¿çšãæ€èšããŠãã ããããããã®ã©ã€ãã©ãªã¯ãç¶æ ã管çããããã®ããé«åºŠãªæ©èœãæäŸããããã¯ã®ã³ã³ããžã·ã§ã³ãç°¡çŽ åã§ããŸãã
- ãšã©ãŒãã³ããªã³ã°ã«ã€ããŠèããïŒ äºæããªãåäœãé²ãããã«ãããã¯ã«å ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŸãããšã©ãŒããã£ããããæçãªãšã©ãŒã¡ãã»ãŒãžãæäŸããããã«try-catchãããã¯ã䜿çšããããšãæ€èšããŠãã ããã
- ããã©ãŒãã³ã¹ãèæ ®ããïŒ ããã¯ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã«æ³šæããŠãã ãããäžèŠãªåã¬ã³ããªã³ã°ãé¿ããããã©ãŒãã³ã¹ã®ããã«ã³ãŒããæé©åããŸããå¿ èŠã«å¿ããŠReact.memoãuseMemoãuseCallbackã䜿çšããŠããã©ãŒãã³ã¹ãæé©åããŸãã
çµè«
Reactã«ã¹ã¿ã ããã¯ã®ã³ã³ããžã·ã§ã³ã¯ãè€éãªããžãã¯ãæœè±¡åããã³ãŒãã®åå©çšæ§ãä¿å®æ§ããã¹ãå®¹ææ§ãåäžãããããã®åŒ·åãªãã¯ããã¯ã§ããè€éãªã¿ã¹ã¯ãããå°ããã管çããããããã¯ã«åå²ããããšã§ãããã¢ãžã¥ãŒã«åãããæŽçãããã³ãŒãããŒã¹ãäœæã§ããŸãããã®èšäºã§æŠèª¬ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãã«ã¹ã¿ã ããã¯ã®ã³ã³ããžã·ã§ã³ã广çã«æŽ»çšããŠãå ç¢ã§ã¹ã±ãŒã©ãã«ãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããåžžã«ã³ãŒãã®æçããšç°¡æœããåªå ããç¹å®ã®ããŒãºã«æé©ãªãã®ãèŠã€ããããã«ãããŸããŸãªã³ã³ããžã·ã§ã³ãã¿ãŒã³ã詊ãããšãæããªãã§ãã ããã